Look and say
Egy tök érdekes feladványba botlottam bele a minap, amely a lookandsay nevet viseli, állásinterjúkon előszeretettel adják feladványként (forrás).
A feladat az, hogy hozzunk létre egy 10 lépésből álló ciklust, amelynek az első kiirandó eleme: 1. Mit is látunk? 1 db 1-est. Szuper, akkor a második lépésben irassuk ki, hogy hány darabot látunk az adott számból, ilyen formában: 11. Oké, és most mit látunk? 2 db 1-est. Most akkor ezt irassuk ki így: 21. De jó, és most mit látunk? 1 db 2-es és 1 db 1-est. Ezt irassuk ki így: 1211... A következő kiirandó ez alapján mi is lesz? Ez: 111221... És így tovább! Nem túl életszagú, viszont a logikát tök jól fejleszti és teszteli. A megoldást ide feltettem. Igazából a megoldás elég egyszerű, ha az ember logikusan végiggondolja a feladatot. Hiszen mi is kell hozzá? Kezdésnek ki kell iratni az 1-es számot, majd egy for cikluson 10 alkalommal végigmenni, a kiírt számot átadni a feldolgozó programnak, ahol egy másik for ciklussal végigmegyünk a szám karakterein, egészen addig, amíg egy olyan számig jutunk, ami nem egyezik a szám legelső karakterével. Itt aztán megszámoljuk, hányszor mentünk végig a for cikluson.
A gyakorlatban a lépések:
- a main függvényben az induló számmal elindítjuk a for ciklust 10 alkalommal, kiiratjuk a számot, majd meghívjuk a lookandsay függvényt első körben az 1-es számmal
- amit a függvény visszaad, azt elmentjük a result változóba, a következő körben kiiratjuk, majd ezzel az új számmal futtatjuk le a lookandsay függvényt, és így tovább
- a lookandsay függvényben biztos ami biztos megnézzük, hogy a megkapott karakterlánc nem üres-e
- ha nem, akkor egy for ciklussal végigmegyünk a karakterlánc minden egyes karakterén, és amennyiben az adott karakter nem egyezik a karakterlánc legelső karakterével, akkor a totalNum változóba elmentjük az addig bejárt karakterláncot (pl. ha az 111112 karakterláncot vizsgáljuk, akkor a változóban az 11111 karakterlánc kerül elmentésre)
- van egy StringBuilder() nevű függvénye a JAVA-nak, ami annyit csinál, hogy az append metódusával szépen hozzá lehet adni a már meglévő karakterlánchoz további karakterláncokat. így hát az sb nevű Stringhez szépen hozzáadjuk a totalNum változó hosszát és az utolsó karakterét (ami az 1-es szám a fenti példában)
- legeslegvégül az utolsó karaktert még hozzá kell adni a megjelentendő és a következő körben feldolgozandó karakterlánchoz. Itt annyit csiálunk, hogy az utolsólag megállapított pozíció és az utolsó karakter hosszát tesszük hozzá a kiirandó karakterláncunkhoz, plusz az utolsó karaktert.
Ennyi az egész, lényeg a nyugalom és a feladat logikus végiggondolása.